/**
解析xml文件
Go语言的反射机制，可以利用这些tag信息来将来自XML文件中的数据反射成对应的struct对象
 *WangGANG
 *2018/9/27
 */
package main

import (
	"fmt"
	"encoding/xml"
	"tool"
	"io/ioutil"
	"os"
)

const FILE  =  "src/xml/TextXml.xml"

//struct定义中的所有字段首字母必须是大写的，表示是公共的
type Recurlyservers struct {
	XMLName     xml.Name `xml:"servers"`   //这里的xml.Name 必须写成这样才能正确取出相对应信息
	Version     string   `xml:"version,attr"`
	Svs         []server `xml:"server"`
	Description string   `xml:",innerxml"` //如果struct的一个字段是string或者[]byte类型且它的tag含有",innerxml"，
											 // Unmarshal将会将此字段所对应的元素内所有内嵌的原始xml累加到此字段上
}

//格式：名称 类型 映射类型(xml中类型)
type server struct {
	XMLName    xml.Name `xml:"server"`    //这里的xml.Name 必须写成这样才能正确取出相对应信息
	ServerName string   `xml:"serverName"`
	ServerIP   string   `xml:"serverIP"`
}


func main() {

	//第一种方法，获取文件
	file,err := os.Open(FILE)
	tool.ErrTest(err)
	defer file.Close()
	data,err := ioutil.ReadAll(file)

	//第二种方法，获取文件
	//data,err := ioutil.ReadFile(FILE)

	tool.ErrTest(err)
	v := Recurlyservers{}
	err = xml.Unmarshal(data,&v)
	tool.ErrTest(err)
	fmt.Println("v:",v)
	fmt.Println("-------------------------------")
	fmt.Println("v.XMLName:",v.XMLName)
	fmt.Println("v.Version:",v.Version)
	fmt.Println("v.Description:",v.Description)
	fmt.Println("v.Svs:",v.Svs)
	for  _,v := range v.Svs  {
		fmt.Println(v.ServerName)
	}
}

